Translate GDK_KEY_KP_Decimal according to locale
authorMatthias Clasen <mclasen@redhat.com>
Tue, 20 Oct 2015 15:06:43 +0000 (11:06 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Sun, 25 Oct 2015 17:59:48 +0000 (13:59 -0400)
It makes sense that you should be able to type numbers that are
correctly formatted and parsable according to the current locale,
using just the keypad. This patch makes it so by translating
GDK_KEY_KP_Decimal to the decimal separator for the current locale,
instead of hardcoding a '.'.

https://bugzilla.gnome.org/show_bug.cgi?id=756751

gdk/gdkkeyuni.c

index d770737cccb369ccd5a945c68155bc3118b27b86..ea28010f870050fb1ced1d38d8d01607b2e0050a 100644 (file)
@@ -27,6 +27,7 @@
 #include "gdkkeys.h"
 #include "gdktypes.h"
 
+#include <locale.h>
 
 /* Thanks to Markus G. Kuhn <mkuhn@acm.org> for the ksysym<->Unicode
  * mapping functions, from the xterm sources.
@@ -872,6 +873,23 @@ static const struct {
 #endif
 };
 
+static gunichar
+get_decimal_point (void)
+{
+  struct lconv *locale_data;
+  const gchar *decimal_point;
+  gunichar ret;
+
+  locale_data = localeconv ();
+  decimal_point = locale_data->decimal_point;
+
+  ret = g_utf8_get_char_validated (decimal_point, -1);
+  if (ret != (gunichar)-2 && ret != (gunichar)-1)
+    return ret;
+
+  return (gunichar) '.';
+}
+
 /**
  * gdk_keyval_to_unicode:
  * @keyval: a GDK key symbol 
@@ -899,6 +917,9 @@ gdk_keyval_to_unicode (guint keyval)
   if ((keyval & 0xff000000) == 0x01000000)
     return keyval & 0x00ffffff;
 
+  if (keyval == 0xffae)
+    return (guint32) get_decimal_point ();
+
   /* binary search in table */
   while (max >= min) {
     mid = (min + max) / 2;